
/*
    基础使用示例
    功能配置请移步app_manager_conf.h内进行配置
*/

#if 0 // 1启用实示例  0禁用

#include "app_manager.h"

LV_IMG_DECLARE(app_manager_icon_test);

void *app_create_ui(void *arg) // 创建界面 以LVGL为例
{
    lv_obj_t *scr = lv_obj_create(NULL);
    //....

    return scr;
}

void app_destroy_ui(void *arg) // 删除界面 以LVGL为例
{
    lv_obj_del((lv_obj_t *)arg);
}

void app_init(void *arg) // app开机初始化回调
{
    //....
}

void kill_process(void *arg) // app被杀掉回调
{
    //....
}

void load_to_foreground(void *arg) // 加载到前台回调
{
    //....
}

void test_app_register()
{
    app_register_t cfg;                   // 配置结构体
    app_manager_config_struct_init(&cfg); // 初始化结构体

    cfg.name = "app_test";
    cfg.author = "启凡科创";
    cfg.version = "1.0.0";
    cfg.ui_type = APP_UI_HAVE;

    cfg.create_ui = app_create_ui;
    cfg.destroy_ui = app_destroy_ui;

    cfg.init = app_init;
    cfg.load_to_background = NULL; // 无需使用填写NULL即可
    cfg.load_to_foreground = load_to_foreground;
    cfg.icon = &app_manager_icon_test; // 图标

    cfg.kill_process = kill_process;

    app_manager_register_app(&cfg);                   // 注册APP方式1
    app_manager_task(APP_MANAGER_REGISTER_APP, &cfg); // 注册APP方式2
}

// 此函数内进行APP注册，无需用户调用
void app_manager_register()
{

    test_app_register();

    // ....其他app
}

void app_load_ui(void *ui, void *anim, uint16_t time, uint16_t delay)
{
    lv_obj_t *scr = (lv_obj_t *)ui;
    lv_scr_load_anim_t load_anim = (lv_scr_load_anim_t)anim;
    lv_scr_load_anim(scr, load_anim, time, delay, 1);
}

void mutex_get()
{
    // rtos mutex get
}

void mutex_give()
{
    // rtos mutex give
}

void *my_malloc(uint32_t size)
{
    return malloc(size);
}

void my_free(void *ptr)
{
    free(ptr);
}

void app_manager_example(void)
{
    // fs todo

    // 如果在配置中启用使用自定义内存管理接口，需使用此接口进行注册
    app_manager_register_malloc_free_cb(my_malloc, my_free);

    // 如果在配置中启用RTOS多线程使用使能，需使用此接口进行注册,esp平台无需注册
    app_manager_mutex_cb_t mutex_cb = {mutex_get, mutex_give};
    app_manager_register_mutex_cb(&mutex_cb);

    app_manager_init(); // 初始化app管理器

    app_manager_ui_register_load_cb(app_load_ui); // 注册加载界面回调

    printf("installed app number:%d\n", app_manager_get_installed_number()); // 打印已安装的APP数量

    app_register_t *test_app = app_manager_get_installed_app(0, "app_test"); // 名称获取app对象

    uint8_t id = app_manager_get_installed_app_id("app_test");
    if (id != 255)
    {
        app_register_t *test_app = app_manager_get_installed_app(id, NULL); // ID获取app对象
    }

    printf("app name:%s,version:%s\n", test_app->name, test_app->version);

    //////////////////////其他APP可获取app图标进行显示
    lv_obj_t *img = lv_img_create(NULL);
    lv_img_set_src(img, &test_app->icon); // 使用图标
                                          ///////////////////////

    app_manager_open(0, "app_test", (void *)LV_SCR_LOAD_ANIM_FADE_IN, 500, 0); // 打开app

    app_manager_task(APP_MANAGER_DEL_UI, (void *)"last_app"); // 删除上一个APP的UI缓存，注意要在当前APP加载完后才能删除，否则会死机,LVGL可以自动删除旧界面，可以不使用
}

#endif